home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 1 / PCU0103CD1.iso / entertn / demos / files / aomtrial.exe / AOM / AI / SCN25P4.XS < prev    next >
Encoding:
Text File  |  2002-08-12  |  9.2 KB  |  257 lines

  1. //==============================================================================
  2. // Scn25p4: AI Scenario Script for scenario 25 player 4
  3. //==============================================================================
  4. /*
  5.    AI owner:  Dave Leary
  6.    Scenario owner: Joe "The Golem" Gillum
  7.  
  8.    Overview: Very basic AI script that trains giants and einherjar.
  9.     
  10.    This AI takes the majority of generated units and sends them to attack the HP,
  11.     leaving a few behind at the gather point for town defense.  It relies on P2 to
  12.     do its scouting for it.  Population is provided by houses at the back of the
  13.     map.
  14. */
  15. //==============================================================================
  16. include "scn lib.xs";
  17.  
  18. //==============================================================================
  19. // Set Town Location
  20. //==============================================================================
  21. void setTownLocation(void)
  22. {
  23.    //Look for the "Town Location" marker.
  24.    kbSetTownLocation(kbGetBlockPosition("8087"));
  25. }
  26.  
  27. //==============================================================================
  28. // miscStartup
  29. //==============================================================================
  30. void miscStartup(void)
  31. {
  32.    //Startup message(s).
  33.    aiEcho("");
  34.    aiEcho("");
  35.    aiEcho("Scn25P4 AI Start, filename='"+cFilename+"'.");
  36.    //Spit out the map size.
  37.    aiEcho("  Map size is ("+kbGetMapXSize()+", "+kbGetMapZSize()+").");
  38.    //Cheat like a bastard.  Once only, though.
  39.    kbLookAtAllUnitsOnMap();
  40.    //Calculate some areas.
  41.    kbAreaCalculate(1200.0);
  42.    //Set our town location.
  43.    setTownLocation();
  44.     //Reset random seeds
  45.     aiRandSetSeed();
  46.  
  47.     //Allocate all resources to the root escrow by setting percentage of military/economy to 0.
  48.     kbEscrowSetPercentage( cEconomyEscrowID, cAllResources, 0.0 );
  49.     kbEscrowSetPercentage( cMilitaryEscrowID, cAllResources, 0.0 );
  50.  
  51.    //Allocate all resources
  52.    kbEscrowAllocateCurrentResources();
  53. }
  54.  
  55. //==============================================================================
  56. //==============================================================================
  57. // Attack stuff.
  58. //==============================================================================
  59. //==============================================================================
  60. // Shared variables.
  61. int numberAttacks=0;
  62. int attackPlayerID=-1;
  63.  
  64. // Attack vars.
  65. int attackPlanID=-1;
  66.  
  67. // Saved maintain plan IDs
  68. int maintainPlan1ID=-1;
  69. int maintainPlan2ID=-1;
  70.  
  71. // Unit types
  72. int attackerUnitTypeID1=cUnitTypeMountainGiant;
  73. int attackerUnitTypeID2=cUnitTypeEinheriar;
  74.  
  75. //==============================================================================
  76. // initAttack: Creates attack routes, etc.
  77. //==============================================================================
  78. void initAttack(int playerID=-1)
  79. {
  80.    //Destroy all previous attacks (if this isn't the player we're already attacking.)
  81.    if (playerID != attackPlayerID)
  82.    {
  83.       //Reset the attack player ID.
  84.       attackPlayerID=-1;
  85.       //Destroy any previous attack plan.
  86.       aiPlanDestroy(attackPlanID);
  87.       attackPlanID=-1;
  88.  
  89.       //Reset the number of attacks.
  90.       numberAttacks=0;
  91.    }
  92.  
  93.    //Save the player to attack.
  94.    attackPlayerID=playerID;
  95. }
  96.  
  97. //==============================================================================
  98. // setupAttack
  99. //==============================================================================
  100. bool setupAttack(int playerID=-1)
  101. {
  102.     //Info.
  103.     aiEcho("Attacking Player "+playerID+".");
  104.  
  105.    //If the player to attack doesn't match, init the attack.
  106.    if (attackPlayerID != playerID)
  107.    {
  108.       initAttack(playerID);
  109.       if (attackPlayerID < 0)
  110.          return(false);
  111.    }
  112.  
  113.    //Create an attack plan.
  114.    int newAttackPlanID=aiPlanCreate("Attack Player"+attackPlayerID+" Attempt"+numberAttacks, cPlanAttack);
  115.    if (newAttackPlanID < 0)
  116.       return(false);
  117.  
  118.    //Target player (required).  This must work.
  119.    if (aiPlanSetVariableInt(newAttackPlanID, cAttackPlanPlayerID, 0, attackPlayerID) == false)
  120.       return(false);
  121.  
  122.    //Gather point.
  123.     vector gatherPoint=kbGetBlockPosition("8087");
  124.  
  125.     //Set the target type.  This must work.
  126.    if (aiPlanSetNumberVariableValues(newAttackPlanID, cAttackPlanTargetTypeID, 2, true) == false)
  127.       return(false);
  128.     
  129.     aiPlanSetNumberVariableValues(newAttackPlanID, cAttackPlanTargetTypeID, 2, true);
  130.  
  131.    //Unit types to attack.
  132.    aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 0, cUnitTypeUnit);
  133.     aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 1, cUnitTypeBuilding);
  134.  
  135.    //Set the gather point and gather point distance.
  136.    aiPlanSetVariableVector(newAttackPlanID, cAttackPlanGatherPoint, 0, gatherPoint);
  137.    aiPlanSetVariableFloat(newAttackPlanID, cAttackPlanGatherDistance, 0, 25.0);
  138.  
  139.     // Add the unit types to the plan - giants...
  140.    // aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID1, 0, 1, 1);
  141.     //...and einhariwhatsises...
  142.     aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID2, 2, 3, 3);
  143.     
  144.    //Set the initial position.
  145.    aiPlanSetInitialPosition(newAttackPlanID, gatherPoint);
  146.  
  147.    //Plan requires all need units to work (can be false).
  148.    aiPlanSetRequiresAllNeedUnits(newAttackPlanID, true);
  149.    
  150.     //Activate the plan.
  151.    aiPlanSetActive(newAttackPlanID);
  152.  
  153.    //Now, save the attack plan ID appropriately.
  154.    aiPlanSetOrphan(attackPlanID, true);
  155.    attackPlanID=newAttackPlanID;
  156.  
  157.    //Increment our overall number of attacks.
  158.    numberAttacks++;
  159. }
  160.  
  161. //==============================================================================
  162. // Attack Generator - Send dudes now!  Or, well, soon.
  163. //==============================================================================
  164. rule attackGenerator
  165.    minInterval 310
  166.    inactive
  167.    group AttackRules
  168. {
  169.    //See how many "idle" attack plans we have.  Don't create any more if we have
  170.    //idle plans.
  171.    int numberIdleAttackPlans=aiGetNumberIdlePlans(cPlanAttack);
  172.  
  173.    if (numberIdleAttackPlans > 0)
  174.       return;
  175.  
  176.    //If we have enough unassigned military units, create a new attack plan.
  177.    int numberAvailableUnits=aiNumberUnassignedUnits(attackerUnitTypeID2);
  178.    aiEcho("There are "+numberAvailableUnits+" einheriwhatsis available for a new attack.");
  179.    
  180.     if (numberAvailableUnits >= 2)
  181.         setupAttack(1);
  182. }
  183.  
  184. //==============================================================================
  185. // Attack Enabler - 7:15 minutes in
  186. //==============================================================================
  187. rule attackEnabler
  188.    minInterval 400
  189.    active
  190.    group AttackRules
  191. {
  192.     aiEcho("*** ATTACKS ENABLED - P4 ***");
  193.     xsEnableRule("attackGenerator");
  194.     xsDisableSelf();
  195. }
  196.  
  197.  
  198. //==============================================================================
  199. // Favor cheat
  200. //==============================================================================
  201. rule favorCheat
  202.    minInterval 60
  203.    active
  204.    group AttackRules
  205. {
  206.     // Cheat for favor.  It's tough to be Norse.
  207.     aiResourceCheat( 4, cResourceFavor, 100.0 );
  208. }
  209.  
  210. //==============================================================================
  211. // MAIN.
  212. //==============================================================================
  213. void main(void)
  214. {
  215.     vector gatherPoint=kbGetBlockPosition("8087");
  216.     
  217.     // Locations for spawning fun
  218.     miscStartup();
  219.  
  220.    //Maintain mountain giants - two total, one that gets sent
  221.     /*
  222.    maintainPlan1ID=aiPlanCreate("Maintain 2 "+kbGetProtoUnitName(attackerUnitTypeID1), cPlanTrain);
  223.    if (maintainPlan1ID >= 0)
  224.    {
  225.         //Must set the type of unit to train.
  226.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanUnitType, 0, attackerUnitTypeID1);
  227.       //You can limit the number of units that are ever trained by this plan with this call.
  228.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  229.       //Set the number of units to maintain in the world at one time.
  230.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanNumberToMaintain, 0, 2);
  231.       //Don't train units too fast
  232.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanFrequency, 0, 90);
  233.       //Set a gather point.
  234.       aiPlanSetVariableVector(maintainPlan1ID, cTrainPlanGatherPoint, 0, gatherPoint);
  235.       //Activate the plan.
  236.       aiPlanSetActive(maintainPlan1ID);
  237.    }
  238.     */
  239.  
  240.     //Maintain einherjar - six total, three get sent at a time.
  241.    maintainPlan2ID=aiPlanCreate("Maintain 6 "+kbGetProtoUnitName(attackerUnitTypeID2), cPlanTrain);
  242.    if (maintainPlan2ID >= 0)
  243.    {
  244.         //Must set the type of unit to train.
  245.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanUnitType, 0, attackerUnitTypeID2);
  246.       //You can limit the number of units that are ever trained by this plan with this call.
  247.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  248.       //Set the number of units to maintain in the world at one time.
  249.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanNumberToMaintain, 0, 6);
  250.       //Don't train units too fast
  251.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanFrequency, 0, 20);
  252.       //Set a gather point.
  253.       aiPlanSetVariableVector(maintainPlan2ID, cTrainPlanGatherPoint, 0, gatherPoint);
  254.       //Activate the plan.
  255.       aiPlanSetActive(maintainPlan2ID);
  256.    }
  257. }